//
//  WBStatusListViewModel.swift
//  传智微博
//
//  Created by zuxi li on 2017/3/19.
//  Copyright © 2017年 lingtu. All rights reserved.
//

import Foundation


/// 微博数据列表视图模型
/* 父类的选择
 如果类需要使用 ‘KVC’ 或者字典转模型框架，设置对象值，类就需要继承NSObject
 如果类只是包装一些代码逻辑（写了一些函数），可以不用任何父类，好处就是更加轻量级， 占用内存消耗会小， 如果用OC写一律都继承自NSObject
 
 使命:负责微博的数据处理
 1. 字典转模型
 2。 下拉/ 上拉数据处理
 */

// 上拉刷新最大尝试次数
fileprivate let maxPullupTryTimes = 3

class WBStatusListViewModel {
    // 微博模型数据懒加载
    lazy var statusList = [WBStatus()]
    
    // 上拉刷新错误此时
    fileprivate var pullupErrorTimers = 0
    
    
    /// 加载微博列表
    ///
    /// - Parameter pullup: 是否上拉刷新标记
    /// - Parameter completion: 完成回调[网络请求是否成功, 是否有刷新表格]
    func loadStatus(pullup: Bool, completion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()) {
        
        // 判断是否是上拉刷新，同时检查刷新错误
        if pullup && pullupErrorTimers > maxPullupTryTimes {
            completion(true, false)
            return
        }
        // since_id 取出数组中第一条微博的id
        let since_id = pullup ? 0 : (statusList.first?.id ?? 0)
        // 上拉刷新，取出数组的最后一条微博的id
        let max_id = !pullup ? 0 : (statusList.last?.id ?? 0)
        WBNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            // 字典转模型
            guard let array = NSArray.yy_modelArray(with: WBStatus.self, json: list ?? []) as? [WBStatus] else {
                completion(isSuccess, false)
                return
            }
            
            // 2.拼接数据
            // 下拉刷新，应该将结果数组，拼接在数据组前面
            if pullup {
                self.statusList += array
            } else {
                self.statusList = array + self.statusList
            }
            
            // 判断上拉刷新的数据量
            if pullup && array.count == 0 {
                self.pullupErrorTimers += 1
                completion(isSuccess, false)
            } else {
                // 3. 完成回调
                completion(isSuccess, true)
            }
            
        }
    }
}
